package request

import (
	"strings"

	"github.com/gin-gonic/gin"
	"lab.com/define/errorcode"
)

// FileListReq 文档列表查询参数
type FileListReq struct {
	Name  string `json:"name" form:"name" comment:"名称"`
	PID    int    `json:"pid" form:"pid" comment:"父文件夹id，查询该文件夹下的内容列表，进入项目管理页面传0"`
	PageOffset
	BaseUserInfo
}

// FileBasicInfo 文档列表信息
type FileBasicInfo struct {
	ID         int    `json:"id"`
	Name      string `json:"name"`
	Type       int    `json:"type"`
	UpdateTime string `json:"update_time"`
	CreateTime string `json:"create_time"`
	OwnerID int `json:"owner_id"`
	OwnerName string `json:"owner_name"`
}

// FileListRes 文档列表返回结果
type FileListRes struct {
	List  []FileBasicInfo `json:"list"`
	Count int             `json:"count"`
}

// CheckInputParams return input params
func (file *FileListReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}

	file.ParseOffset()
	file.BaseUserInfo.CheckInputParams(c)
	return nil
}

// FileAddReq 新增文件/文件夹参数
type FileAddReq struct {
	Name       string `json:"name" form:"name" validate:"required" comment:"名称"`
	PID         int    `json:"pid" form:"pid" comment:"该文件的父id"`
	Type  int    `json:"type" form:"type" validate:"oneof=10 20" comment:"10文件夹 20文件"`
	AccessUsers     string `json:"access_users" form:"access_users" comment:"自定义访问权限下，可以访问的用户"`
	AccessType int `json:"access_type" form:"access_type" comment:"访问权限 10公开 20自定义 30私有"`
	Content      string `json:"content" form:"content"  comment:"文档内容"`
	BaseUserInfo
}

// CheckInputParams return input params
func (file *FileAddReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}
	file.BaseUserInfo.CheckInputParams(c)
	return nil
}

// FileRenameReq 文件重命名参数
type FileRenameReq struct {
	ID          int    `json:"id" form:"id" validate:"required" comment:"文件夹id"`
	Name       string `json:"name" form:"name" validate:"required" comment:"名称"`
}

// CheckInputParams return input params
func (file *FileRenameReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}

	return nil
}

// FileDeleteReq 文件删除参数
type FileDeleteReq struct {
	ID     int `json:"id" form:"id" validate:"required" comment:"文件id"`
}

// CheckInputParams return input params
func (file *FileDeleteReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}

	return nil
}


// FileEditReq 编辑文档参数
type FileEditReq struct {
	ID     int `json:"id" form:"id" validate:"required" comment:"文件id"`
	Content      string `json:"content" form:"content" validate:"required" comment:"文档内容"`
}

// CheckInputParams return input params
func (file *FileEditReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}

	return nil
}

// FileAccessEditReq 编辑文件夹权限参数
type FileAccessEditReq struct {
	ID     int `json:"id" form:"id" validate:"required" comment:"文件夹id"`
	AccessUsers     string `json:"access_users" form:"access_users" comment:"自定义访问权限下，可以访问的用户"`
	AccessType int `json:"access_type" form:"access_type" validate:"required" comment:"访问权限 10公开 20自定义 30私有"`
}

// CheckInputParams return input params
func (file *FileAccessEditReq) CheckInputParams(c *gin.Context) error {

	if err := c.ShouldBind(file); err != nil {
		return err
	}
	if errs, err := Validate(file); err != nil {
		return errorcode.New(errorcode.ErrParams, strings.Join(errs, ","), nil)
	}

	return nil
}